using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._GeoAnalyticsServerTools._ManageData
{
    /// <summary>
    /// <para>Overlay Layers</para>
    /// <para>Overlays the geometries from multiple layers into a single layer.  Overlay can be used to combine, erase, modify, or update spatial features.</para>
    /// <para>将多个图层中的几何图形叠加到单个图层中。 叠加可用于合并、擦除、修改或更新空间要素。</para>
    /// </summary>    
    [DisplayName("Overlay Layers")]
    public class OverlayLayers : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public OverlayLayers()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_input_layer">
        /// <para>Input Layer</para>
        /// <para>The point, line, or polygon features that will be overlaid with the overlay layer.</para>
        /// <para>将叠加图层叠加的点、线或面要素。</para>
        /// </param>
        /// <param name="_overlay_layer">
        /// <para>Overlay Layer</para>
        /// <para>The features that will be overlaid with the input layer features.</para>
        /// <para>将与输入图层要素叠加的要素。</para>
        /// </param>
        /// <param name="_output_name">
        /// <para>Output Name</para>
        /// <para>The name of the output feature service.</para>
        /// <para>输出要素服务的名称。</para>
        /// </param>
        /// <param name="_overlay_type">
        /// <para>Overlay Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of overlay to be performed.</para>
        ///   <bulletList>
        ///     <bullet_item>Intersect—Computes a geometric intersection of the input layers. Features or portions of features that overlap in both the input layer and overlay layer will be written to the output layer. This is the default.</bullet_item><para/>
        ///     <bullet_item>Erase—Only those features or portions of features in the overlay layer that are not within the features in the input layer are written to the output.</bullet_item><para/>
        ///     <bullet_item>Union— Computes a geometric union of the input layer and overlay layer. All features and their attributes will be written to the layer.</bullet_item><para/>
        ///     <bullet_item>Identity— Computes a geometric intersection of the input features and identity features. Features or portions of features that overlap in both input layer and overlay layer will be written to the output layer.</bullet_item><para/>
        ///     <bullet_item>Symmetrical Difference— Features or portions of features in the input layer and overlay layer that do not overlap will be written to the output layer.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要执行的叠加类型。</para>
        ///   <bulletList>
        ///     <bullet_item>相交 （Intersect） - 计算输入图层的几何交点。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>拭除 - 仅将叠加图层中不在输入图层要素内的要素或部分要素写入输出。</bullet_item><para/>
        ///     <bullet_item>并集 — 计算输入层和叠加层的几何并集。所有要素及其属性都将写入图层。</bullet_item><para/>
        ///     <bullet_item>身份 - 计算输入要素和身份要素的几何交集。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。</bullet_item><para/>
        ///     <bullet_item>对称差分 - 输入图层和叠加图层中不重叠的要素或要素部分将被写入输出图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        public OverlayLayers(object _input_layer, object _overlay_layer, object _output_name, _overlay_type_value _overlay_type)
        {
            this._input_layer = _input_layer;
            this._overlay_layer = _overlay_layer;
            this._output_name = _output_name;
            this._overlay_type = _overlay_type;
        }
        public override string ToolboxName => "GeoAnalytics Server Tools";

        public override string ToolName => "Overlay Layers";

        public override string CallName => "geoanalytics.OverlayLayers";

        public override List<string> AcceptEnvironments => ["extent", "outputCoordinateSystem", "workspace"];

        public override object[] ParameterInfo => [_input_layer, _overlay_layer, _output_name, _overlay_type.GetGPValue(), _include_overlaps.GetGPValue(), _data_store.GetGPValue(), _output];

        /// <summary>
        /// <para>Input Layer</para>
        /// <para>The point, line, or polygon features that will be overlaid with the overlay layer.</para>
        /// <para>将叠加图层叠加的点、线或面要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _input_layer { get; set; }


        /// <summary>
        /// <para>Overlay Layer</para>
        /// <para>The features that will be overlaid with the input layer features.</para>
        /// <para>将与输入图层要素叠加的要素。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Overlay Layer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _overlay_layer { get; set; }


        /// <summary>
        /// <para>Output Name</para>
        /// <para>The name of the output feature service.</para>
        /// <para>输出要素服务的名称。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Name")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _output_name { get; set; }


        /// <summary>
        /// <para>Overlay Type</para>
        /// <para><xdoc>
        ///   <para>Specifies the type of overlay to be performed.</para>
        ///   <bulletList>
        ///     <bullet_item>Intersect—Computes a geometric intersection of the input layers. Features or portions of features that overlap in both the input layer and overlay layer will be written to the output layer. This is the default.</bullet_item><para/>
        ///     <bullet_item>Erase—Only those features or portions of features in the overlay layer that are not within the features in the input layer are written to the output.</bullet_item><para/>
        ///     <bullet_item>Union— Computes a geometric union of the input layer and overlay layer. All features and their attributes will be written to the layer.</bullet_item><para/>
        ///     <bullet_item>Identity— Computes a geometric intersection of the input features and identity features. Features or portions of features that overlap in both input layer and overlay layer will be written to the output layer.</bullet_item><para/>
        ///     <bullet_item>Symmetrical Difference— Features or portions of features in the input layer and overlay layer that do not overlap will be written to the output layer.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定要执行的叠加类型。</para>
        ///   <bulletList>
        ///     <bullet_item>相交 （Intersect） - 计算输入图层的几何交点。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>拭除 - 仅将叠加图层中不在输入图层要素内的要素或部分要素写入输出。</bullet_item><para/>
        ///     <bullet_item>并集 — 计算输入层和叠加层的几何并集。所有要素及其属性都将写入图层。</bullet_item><para/>
        ///     <bullet_item>身份 - 计算输入要素和身份要素的几何交集。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。</bullet_item><para/>
        ///     <bullet_item>对称差分 - 输入图层和叠加图层中不重叠的要素或要素部分将被写入输出图层。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Overlay Type")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public _overlay_type_value _overlay_type { get; set; }

        public enum _overlay_type_value
        {
            /// <summary>
            /// <para>Intersect</para>
            /// <para>Intersect—Computes a geometric intersection of the input layers. Features or portions of features that overlap in both the input layer and overlay layer will be written to the output layer. This is the default.</para>
            /// <para>相交 （Intersect） - 计算输入图层的几何交点。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。这是默认设置。</para>
            /// </summary>
            [Description("Intersect")]
            [GPEnumValue("INTERSECT")]
            _INTERSECT,

            /// <summary>
            /// <para>Erase</para>
            /// <para>Erase—Only those features or portions of features in the overlay layer that are not within the features in the input layer are written to the output.</para>
            /// <para>拭除 - 仅将叠加图层中不在输入图层要素内的要素或部分要素写入输出。</para>
            /// </summary>
            [Description("Erase")]
            [GPEnumValue("ERASE")]
            _ERASE,

            /// <summary>
            /// <para>Identity</para>
            /// <para>Identity— Computes a geometric intersection of the input features and identity features. Features or portions of features that overlap in both input layer and overlay layer will be written to the output layer.</para>
            /// <para>身份 - 计算输入要素和身份要素的几何交集。在输入图层和叠加图层中重叠的要素或要素的一部分将被写入输出图层。</para>
            /// </summary>
            [Description("Identity")]
            [GPEnumValue("IDENTITY")]
            _IDENTITY,

            /// <summary>
            /// <para>Union</para>
            /// <para>Union— Computes a geometric union of the input layer and overlay layer. All features and their attributes will be written to the layer.</para>
            /// <para>并集 — 计算输入层和叠加层的几何并集。所有要素及其属性都将写入图层。</para>
            /// </summary>
            [Description("Union")]
            [GPEnumValue("UNION")]
            _UNION,

            /// <summary>
            /// <para>Symmetrical Difference</para>
            /// <para>Symmetrical Difference— Features or portions of features in the input layer and overlay layer that do not overlap will be written to the output layer.</para>
            /// <para>对称差分 - 输入图层和叠加图层中不重叠的要素或要素部分将被写入输出图层。</para>
            /// </summary>
            [Description("Symmetrical Difference")]
            [GPEnumValue("SYMMETRICAL_DIFFERENCE")]
            _SYMMETRICAL_DIFFERENCE,

        }

        /// <summary>
        /// <para>Include Overlapping Input Layers</para>
        /// <para><xdoc>
        ///   <para>Specifies whether one or both of the input layers have self-intersecting features. This parameter is only supported for ArcGIS Enterprise 10.6.1.</para>
        ///   <bulletList>
        ///     <bullet_item>Checked—One or both of the layers have overlapping features. This is the default.</bullet_item><para/>
        ///     <bullet_item>Unchecked—Neither layer has overlapping features.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定一个或两个输入图层是否具有自相交要素。此参数仅支持 ArcGIS Enterprise 10.6.1。</para>
        ///   <bulletList>
        ///     <bullet_item>选中 - 其中一个或两个图层具有重叠要素。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>未选中 - 两个图层均不具有重叠要素。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Include Overlapping Input Layers")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _include_overlaps_value _include_overlaps { get; set; } = _include_overlaps_value._true;

        public enum _include_overlaps_value
        {
            /// <summary>
            /// <para>OVERLAPPING</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("OVERLAPPING")]
            [GPEnumValue("true")]
            _true,

            /// <summary>
            /// <para>NOT_OVERLAPPING</para>
            /// <para></para>
            /// <para></para>
            /// </summary>
            [Description("NOT_OVERLAPPING")]
            [GPEnumValue("false")]
            _false,

        }

        /// <summary>
        /// <para>Data Store</para>
        /// <para><xdoc>
        ///   <para>Specifies the ArcGIS Data Store where the output will be saved. The default is Spatiotemporal big data store. All results stored in a spatiotemporal big data store will be stored in WGS84. Results stored in a relational data store will maintain their coordinate system.</para>
        ///   <bulletList>
        ///     <bullet_item>Spatiotemporal big data store—Output will be stored in a spatiotemporal big data store. This is the default.</bullet_item><para/>
        ///     <bullet_item>Relational data store—Output will be stored in a relational data store.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将保存输出的 ArcGIS Data Store。默认值为 Spatiotemporal 大数据存储。存储在时空大数据存储中的所有结果都将存储在 WGS84 中。存储在关系数据存储中的结果将保留其坐标系。</para>
        ///   <bulletList>
        ///     <bullet_item>时空大数据存储 - 输出将存储在时空大数据存储中。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>关系数据存储 - 输出将存储在关系数据存储中。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Data Store")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _data_store_value _data_store { get; set; } = _data_store_value._SPATIOTEMPORAL_DATA_STORE;

        public enum _data_store_value
        {
            /// <summary>
            /// <para>Spatiotemporal big data store</para>
            /// <para>Spatiotemporal big data store—Output will be stored in a spatiotemporal big data store. This is the default.</para>
            /// <para>时空大数据存储 - 输出将存储在时空大数据存储中。这是默认设置。</para>
            /// </summary>
            [Description("Spatiotemporal big data store")]
            [GPEnumValue("SPATIOTEMPORAL_DATA_STORE")]
            _SPATIOTEMPORAL_DATA_STORE,

            /// <summary>
            /// <para>Relational data store</para>
            /// <para>Relational data store—Output will be stored in a relational data store.</para>
            /// <para>关系数据存储 - 输出将存储在关系数据存储中。</para>
            /// </summary>
            [Description("Relational data store")]
            [GPEnumValue("RELATIONAL_DATA_STORE")]
            _RELATIONAL_DATA_STORE,

        }

        /// <summary>
        /// <para>Output Feature Layer</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Layer")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _output { get; set; }


        public OverlayLayers SetEnv(object extent = null, object outputCoordinateSystem = null, object workspace = null)
        {
            base.SetEnv(extent: extent, outputCoordinateSystem: outputCoordinateSystem, workspace: workspace);
            return this;
        }

    }

}